import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 读取CSV文件
data = pd.read_csv("cleaned_data.csv")

# 将 datetime 列转换为日期时间格式
data['datetime'] = pd.to_datetime(data['datetime'])

# 提取月份信息并创建新的列
data['month'] = data['datetime'].dt.month

# 将天气情况标签进行替换
weather_mapping = {
    1: '晴天，多云',
    2: '雾天，阴天',
    3: '小雪，小雨',
    4: '大雨，大雪，大雾'
}
data['weather'] = data['weather'].map(weather_mapping)

# 按照月份和天气情况分组，并计算每组的平均租车人数
monthly_avg_count = data.groupby(['month', 'weather'])['count'].mean().unstack()

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 绘制折线图
plt.figure(figsize=(10, 6))

# 定义更丰富的线型循环列表
line_styles = ['solid', 'dashed', 'dashdot', 'dotted', (0, (5, 10)), (0, (3, 1, 1, 1, 1, 1))]

# 遍历不同的天气情况，绘制每个月的平均租车人数折线图，并在每个点上添加数值标签
for idx, (weather, line_style) in enumerate(zip(monthly_avg_count.columns, line_styles)):
    plt.plot(monthly_avg_count.index, monthly_avg_count[weather],
             marker='o', linestyle=line_style,
             label=f'{weather}', linewidth=2, markersize=8)

    # 在每个点上添加数值标签
    for x, y in zip(monthly_avg_count.index, monthly_avg_count[weather]):
        plt.text(x, y, f'{y:.1f}', ha='center', va='bottom', fontsize=12)  # .1f 表示保留一位小数

plt.title('不同天气情况下每个月的平均租车人数', fontsize=18)
plt.xlabel('月份', fontsize=15)
plt.ylabel('平均租车人数', fontsize=15)
plt.legend(loc='upper left', fontsize=12)
plt.grid(True, which="both", ls="--", alpha=0.5)  # 添加轻微网格线
plt.xticks(range(1, 13))
plt.tight_layout()  # 自动调整子图参数，使之填充整个图像区域

# 绘制完图表之后，获取当前图例的句柄
legend = plt.gca().get_legend()

# 获取图例中的所有句柄
handles = legend.legendHandles

# 设置图例中线条的长度（这里以50为示例长度，您可以根据需要调整）
for handle in handles:
    handle.set_linewidth(1)  # 这里设置线宽，如果需要调整线宽请解开此行注释并调整数值
    handle.set_markersize(10)  # 这里设置marker的大小，如果需要调整请解开此行注释并调整数值
    handle.set_markersize(3)  # 设置线段长度，注意这个操作可能不会直接生效，因为线段长度通常不由markersize控制

# 重新排列图例，确保更新生效
plt.legend(handles=handles, labels=[text.get_text() for text in legend.texts], loc='upper left', fontsize=12)

plt.show()